package echiquier;

import piece.Piece;
import core.Coordonnees;
import core.Couleur;
import core.DeplacementException;
import core.PlacementException;

/**
 * @class case, symbolise les cases de l'échiquier, une case est identifiée par ses coordonnées et abrite éventuellement une piece du jeu 
 * @author baptiste.andrini
 */
public class Case {
	/**
	 * Attributs
	 */
	private Coordonnees coordonnees;
	private Couleur couleur;
	private Piece piece;
	
	/**
	 * Constructeur de la classe, de base, aucune piece ne siege sur la case
	 * @param coordonnees
	 * @param couleur
	 */
	Case (Coordonnees coordonnees, Couleur couleur) {
		super();
		this.coordonnees = new Coordonnees(coordonnees.x, coordonnees.y);
		this.couleur = couleur;
		this.piece = null;
	}

	/**
	 * Accesseur des coordonnées de la case
	 * @return coordonnées de la case
	 */
	public Coordonnees getCoordonnees() {
		return this.coordonnees;
	}
	
	/**
	 * Accesseur de la pièce de la case
	 * @return pièce contenu à la case (null si il n'y en a pas)
	 */
	public Piece getPiece() {
		return piece;
	}

	/**
	 * Accesseur de la couleur de la case
	 * @return couleur de la case
	 */
	public Couleur getCouleur() {
		return couleur;
	}

	/**
	 * Vrai si la case est occupée, faux sinon
	 */
	public boolean isFree() {
		return this.piece == null;
	}
	
	/**
	 * Mutateur de la piece, si la case est déjà occupée, le mutateur n'autorise pas et renvoie une exception
	 * @param piece
	 * @throws DeplacementException
	 */
	public void setPiece(Piece piece) throws PlacementException {
		if (this.piece == null) {
			this.piece = piece;
		} else {
			throw new PlacementException();
		}
	}
	
	/**
	 * Mutateur vidant la case de la pièce qui l'occupait.
	 * @throws  
	 */
	public void departPiece() {
		this.piece = null;
	}
	
	/**
	 * Affichage d'une case, n'affiche pas la pièce qui est dessus
	 */
	public String toString() {
		return "Case "+this.getCoordonnees();
	}
}
